#ifndef __MVS_CLOUD_SERVICE_H__
#define __MVS_CLOUD_SERVICE_H__

#include "mvdef.h"
#include "mvs_core/mvs_core_ability.h"

MVCXX_EXTERN_BEGIN

/*********************************
 *         报警推送服务相关
 ********************************/
/* 报警等级 */
typedef enum _mvs_alarm_level {
    MVS_ALV_LOW      = 1, /* 低 */
    MVS_ALV_NORMAL   = 2, /* 中 */
    MVS_ALV_HIGH     = 3, /* 高 */
    MVS_ALV_CRITICAL = 4, /* 危及 */
} mvs_alarm_level_e;

typedef enum _mvs_alarm_custom_char_encode {
    MVS_CCE_UNKNOWN  = 0,
    MVS_CCE_UTF8     = 1,
} mvs_alarm_cce_e;

/* 报警图片中移动物体坐标&大小 */
typedef struct mvs_alarm_obj_pos_t {
    mv_u16_t u16_x;
    mv_u16_t u16_y;
    mv_u16_t u16_w;
    mv_u16_t u16_h;
} mvs_alarm_obj_pos_t;

/** ai检测结果回调（根据网络情况会有一定滞后性） */
typedef mv_s32_t (*pic_ai_result_f)(mv_s32_t s32_people_num, mv_vptr_t p_arg);
/* 报警参数 */
#define ALARM_PIC_PAD_RESERVE  128
typedef struct _mvs_alarm_info {
    struct {                                    ///< 报警发生点日期信息
        mv_s64_t s64_ts_utc0;                   ///< 触发时间（UNIX标准时间戳，秒）
        mv_s16_t s16_tz;                        ///< 发生时间点设备当前时区（±HHMM , 如东八区：＋0800，如西五区半：-0530）
        mv_s8_t  s8_is_dst;                     ///< 发生瞬时是否启用DST(不大于0则为关闭；大于0则为夏令时+N)
    }date;
    mv_u16_t u16_evt;                           ///< 触发类型 [abl_alert_detect_eid_e]
    mv_u16_t u16_level;                         ///< 触发等级 [mvs_alarm_level_e]
    struct {                                    ///< 自定义报警消息属性
        mv_u8ptr_t pu8_msg_content;             ///< 自定义消息体
        mv_u16_t   u16_msg_content_len;         ///< 自定义消息体长度
        mv_u8_t    u8_char_encode;              ///< 编码类型 [mvs_alarm_cce_e]
        mv_bool_t  bl_custom_en;                ///< 自定义内容使能
    }custom;
    /** 
     * 用户资源释放回调(NULL时为默认对pu8_pic_data和pu8_msg_content进行free操作)
     **/
    mv_s32_t(*f_caller_release_cb)(struct _mvs_alarm_info *pinfo);
    struct {                                    ///< 报警图片信息
        mv_s32_t            s32_pic_len;        ///< 图片大小(0表示无图片)
        mv_u8ptr_t          pu8_pic_data;       ///< 图片数据缓存地址(NULL表示无图片；此缓存需要调用者申请，由被调用者自动释放)
                                                ///< 注意：申请时需要在实际长度基础上额外向后扩大"ALARM_PIC_PAD_RESERVE"长度!!!
        mv_u16_t            u16_obj;            ///< 对象类型
        mv_u8_t             u8_pic_quality;     ///< 图片质量 [mvs_quality_e]
        mv_u8_t             u8_pano_type;       ///< 全景类型，0: invalid; 1: 180 pano; 2: 360 pano
        mv_u32_t            u32_pano_x;         ///< 全景校正圆X坐标(pixel)
        mv_u32_t            u32_pano_y;         ///< 全景校正圆Y坐标(pixel)
        mv_u32_t            u32_pano_r;         ///< 全景校正圆R半径(pixel)
        mv_u8_t             au8_area_name[32];  ///< 触发区域名称
        mv_u16_t            u16_area_name_len;  ///< 触发区域名称长度
        mv_u16_t            u16_obj_coor_num;   ///< 对象坐标数
        mvs_alarm_obj_pos_t astru_position[32]; ///< 对象坐标
        pic_ai_result_f     f_ai_result_cb;     ///< AI检测结果回调
        mv_vptr_t           p_ai_arg;           ///< AI检测结果回调用户参数
    };
}mvs_alarm_info_t;

/**
 * @brief 设置指定类型的本地推送间隔（服务器有指定时，则服务器数据优先）
 * 
 * @param e_type             [in] 报警过滤器类型 [abl_alert_detect_eid_e]
 * @param s32_min_interval   [in] 最小间隔（秒）
 * @param s32_max_interval   [in] 最大间隔（秒）
 * @param s32_time_pool_size [in] 间隔动态池大小（秒，越频繁触发，间隔越大；触发间隔越大，下次可推送间隔越小）
 * @return 设置结果
 * - success : MV_EC_SUCCESS
 * -  failed : MV_EC_INVALID_ARGS
 * 
 * @note 内置最小间隔判断为5秒
 */
mv_s32_t mvs_cloud_push_interval_setting(abl_alert_detect_eid_e e_type, mv_s32_t s32_min_interval, mv_s32_t s32_max_interval, mv_s32_t s32_time_pool_size);
/**
 * @brief 指定类型推送间隔是否Ready
 * 
 * @param u16_alarm_type     [in] 报警过滤器类型 [abl_alert_detect_eid_e]
 * @return 查询结果
 * - success : MV_EC_SUCCESS   (可推送)
 * -  failed : MV_EC_NOT_READY (间隔时间未到)
 */
mv_s32_t mvs_cloud_push_ready(mv_u16_t u16_alarm_type);
/**
 * @brief 推送报警消息
 * 
 * @param pinfo [in] 报警消息数据结构
 * @return 推送操作结果
 * - success : MV_EC_SUCCESS
 * -  failed : MV_EC_NOT_INIT
 *             MV_EC_NOT_READY
 *             MV_EC_MALLOC_FAILED
 *             else
 */
mv_s32_t mvs_cloud_alarm_msg_push(mvs_alarm_info_t *pinfo);

/*********************************
 *          云存储服务相关
 ********************************/
#define CLOUDS_AT2FLAG(at) (1<<at)
typedef struct _cloud_storage_init_args
{
    mv_v8_t  av8_cache_dir[256];  ///< 云存储服务数据缓存目录（'/'结尾）
    mv_u32_t u32_at_filter;       ///< 云存储报警录像事件触发类型过滤器（CLOUDS_AT2FLAG(abl_alert_filter_e)组成的bitmap，触发事件类型不在此过滤器内，均无法触发报警录像）
    mv_u8_t  u8_dst;              ///< 夏令时DST（0 / +1 / +2）
}mvs_clouds_init_args_t;

mv_s32_t mvs_cloud_storage_init(mvs_clouds_init_args_t *pargs);

mv_s32_t mvs_cloud_storage_uninit(mv_time_t ts_await_timeout_ms);

mv_s32_t mvs_cloud_storage_event_occured(abl_alert_filter_e e_at);

mv_s32_t mvs_cloud_storage_arg_update(mvs_clouds_init_args_t *pargs); ///< 目前仅能刷新夏令时配置
/**
 * @brief 获取当前云存服务运行状态
 * 
 * @return 0 = 停止
 * @return 1 = 正在初始化
 * @return 2 = 运行中
 */
mv_s32_t mvs_cloud_storage_status(mv_void_t);

MVCXX_EXTERN_END

#endif
